package com.ajocer.springbootinit.rag;

import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingMatch;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Constructor;

/**
 * EmbeddingMatch工厂类
 * 用于创建EmbeddingMatch实例，解决兼容性问题
 */
@Slf4j
public class EmbeddingMatchFactory {

    /**
     * 创建EmbeddingMatch实例
     * @param score 相似度分数
     * @param segment 文本段
     * @return EmbeddingMatch实例
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public static EmbeddingMatch<TextSegment> create(double score, TextSegment segment) {
        try {
            // 尝试使用不同的构造函数
            try {
                // 尝试使用 (double score, Embedded embedded) 构造函数
                Constructor<EmbeddingMatch> constructor = EmbeddingMatch.class.getConstructor(double.class, Object.class);
                return constructor.newInstance(score, segment);
            } catch (NoSuchMethodException e) {
                // 尝试使用 (double score, String id, Embedded embedded) 构造函数
                try {
                    Constructor<EmbeddingMatch> constructor = EmbeddingMatch.class.getConstructor(double.class, String.class, Object.class);
                    return constructor.newInstance(score, "id-" + System.nanoTime(), segment);
                } catch (NoSuchMethodException e2) {
                    // 最后尝试使用静态工厂方法
                    try {
                        return (EmbeddingMatch<TextSegment>) EmbeddingMatch.class.getMethod("of", double.class, Object.class)
                                .invoke(null, score, segment);
                    } catch (NoSuchMethodException e3) {
                        log.error("无法找到合适的EmbeddingMatch构造方法", e3);
                        throw new RuntimeException("无法创建EmbeddingMatch实例", e3);
                    }
                }
            }
        } catch (Exception e) {
            log.error("创建EmbeddingMatch实例失败", e);
            throw new RuntimeException("创建EmbeddingMatch实例失败", e);
        }
    }
} 